<?php
/**
 * 商品模型
 * @author maniac
 */
namespace app\common\model;
use app\common\model\GoodCategory as GoodCategoryModel;

class Ticketing extends SoftDel
{

    protected $table = "maniac_goods";
    public $tableName = '商品';                   // 数据表名称
    public $logId     = ['id', 'goods_name'];     // 日志操作相关标识
    public $softId    = 1;                        // 软删除标识
    
    protected $autoWriteTimestamp = true;         // 自动写入时间戳
    
    // 自动转换
    protected $type = [
        'category_id'       => 'integer',
        'brand_id'          => 'integer',
        'supplier_id'       => 'integer',
        'cost_price'        => 'float',
        'market_price'      => 'float',
        'sale_price'        => 'float',
        'diy_sale_nums'     => 'integer',
        'goods_stock'       => 'integer',
        'goods_stock_alarm' => 'integer',
        'good_mods_id'      => 'integer',
        'goods_thumb_id'    => 'integer',
        'is_sale'           => 'integer',
        'is_latest'         => 'integer',
        'is_hot_sale'       => 'integer',
        'is_recommand'      => 'integer',
        'is_stock_visible'  => 'integer',
        'max_purchase_nums' => 'integer',
        'min_purchase_nums' => 'integer',
        'list_order'        => 'integer',
    ];

    public function fields()
    {
        $field = 'id,category_id,store_id,goods_name,goods_sn,goods_unit,market_price,sale_price,goods_stock,goods_thumb_id,goods_album,goods_video,goods_keywords,goods_intro,goods_spec_format,goods_detail,collect_nums,comment_stars,evaluate_nums,is_sale,max_purchase_nums,min_purchase_nums,sale_time';
        return $field;
    }

    /**
     * 分类名称获取器
     * @param string $value 字段值
     * @param array  $data  所有数据
     */
    public function getCategoryNameAttr($value, $data)
    {
        $info = GoodCategory::where('id', $data['category_id'])->find();
        return $info['name'];
    }
    
    /**
     * 商品成本价获取器
     * @param string $value 字段值
     * @param array  $data  所有数据
     */
    public function getCostPriceSkuAttr($value, $data)
    {
        $sku = $this->getSkuAttr($value, $data);
        if (empty($sku)) return sprintf('%.2f', $data['cost_price']);
        return sprintf('%.2f', $sku[0]['cost_price']);
    }
    
    /**
     * 商品市场价获取器
     * @param string $value 字段值
     * @param array  $data  所有数据
     */
    public function getMarketPriceSkuAttr($value, $data)
    {
        $sku = $this->getSkuAttr($value, $data);
        if (empty($sku)) return sprintf('%.2f', $data['market_price']);
        return sprintf('%.2f', $sku[0]['market_price']);
    }
    
    /**
     * 商品销售价获取器
     * @param string $value 字段值
     * @param array  $data  所有数据
     */
    public function getSalePriceSkuAttr($value, $data)
    {
        if($data['sale_price']>0){
            return $data['sale_price'];
        }
        $sku = $this->getSkuAttr($value, $data);
        if (empty($sku)) return sprintf('%.2f', $data['sale_price']);
        return sprintf('%.2f', $sku[0]['sale_price']);
    }
    
    /**
     * [getJifenAttr description]
     * @return [type] [description]
     */
    public function getCostJifenAttr($value, $data)
    {
        return ceil($this->getSalePriceSkuAttr($value, $data));
    }
    
    /**
     * 商品缩略图获取器
     * @param  string $value 字段值
     * @param  array  $data  所有数据
     */
    public function getImageUriAttr($value, $data)
    {
        return $data['goods_thumb_id'] ? attach_uri($data['goods_thumb_id']) : '';
    }
    
    /**
     * 商品相册获取器
     * @param  string $value 字段值
     */
    public function getGoodsAlbumAttr($value)
    {
        return $value ? unserialize($value) : '';
    }
    
    /**
     * 商品视频获取器
     * @param  string $value 字段值
     */
    public function getGoodsVideoAttr($value)
    {
        return $value ? unserialize($value) : '';
    }
    
    /**
     * 商品视频获取器
     * @param  string $value 字段值
     * @param  array  $data  所有数据
     */
    public function getGoodsVideoUriAttr($value, $data)
    {
        $video = $this->getGoodsVideoAttr($data['goods_video']);
        return $video ? attach_uri($video[0]['value']) : '';
    }
    
    /**
     * 商品相册获取器
     * @param string $value 字段值
     * @param array  $data  所有数据
     */
    public function getGoodsAlbumDetailAttr($value, $data)
    {
        $album = $data['goods_album'] ? unserialize($data['goods_album']) : [];
        foreach ($album as $k => $v) {
            $album[$k]['value'] = attach_uri($v['value']);
        }
        return $album;
    }
    
    /**
     * 最少购买数量获取器
     * @param string $value 字段值
     * @param array $data   所有数据
     */
    public function getMinPurchaseNumsAttr($value, $data)
    {
        return $value ?: 1;
    }
    
    /**
     * 每人限购数量获取器
     * @param string $value 字段值
     * @param array $data   所有数据
     */
    public function getMaxPurchaseNumsAttr($value, $data)
    {
        return ($value && $value < $data['goods_stock']) ? $value : $data['goods_stock'];
    }
    
    /**
     * 商品规格获取器
     * @param string $value 字段值
     * @param array  $data  所有数据
     */
    public function getGoodsSpecFormatArrayAttr($value, $data)
    {
        $arr = $data['goods_spec_format'] ? json_decode($data['goods_spec_format'], true) : [];
        foreach ($arr as $key => $val) {
            if (!empty($val['spec_value'])) {
                foreach ($val['spec_value'] as $k => $v) {
                    if (isset($v['spec_value_data']) && strpos($v['spec_value_data'], '/static/uploads/') !== false) {
                        $arr[$key]['spec_value'][$k]['spec_value_data'] = config('system.attach_uri_prefix').ltrim($v['spec_value_data'], '/');
                    }
                }
            }
        }
        return $arr;
    }
    
    /**
     * 获取是否上架状态文本
     * @param int   $value 字段值
     * @param array $data  所有数据
     */
    public function getIsSaleTxtAttr($value, $data)
    {
        $txt = ['下架', '上架', '违规（禁售）'];
        return $txt[$data['is_sale']];
    }
    
    /**
     * 获取是否新品状态文本
     * @param int   $value 字段值
     * @param array $data  所有数据
     */
    public function getIsLatestTxtAttr($value, $data)
    {
        $txt = ['非新品', '新品'];
        return $txt[$data['is_latest']];
    }
    
    /**
     * 获取是否热卖状态文本
     * @param int   $value 字段值
     * @param array $data  所有数据
     */
    public function getIsHotSaleTxtAttr($value, $data)
    {
        $txt = ['非热卖', '热卖'];
        return $txt[$data['is_hot_sale']];
    }
    
    /**
     * 获取是否推荐状态文本
     * @param int   $value 字段值
     * @param array $data  所有数据
     */
    public function getIsRecommandTxtAttr($value, $data)
    {
        $txt = ['不推荐', '推荐'];
        return $txt[$data['is_recommand']];
    }
    
    /**
     * 获取上/下架时间
     * @param string $value 字段值
     * @param array $data   所有的数据
     */
    public function getSaleTimeTxtAttr($value, $data)
    {
        return $data['sale_time'] ? date('Y-m-d H:i:s', $data['sale_time']) : '-';
    }
    
    /**
     * 获取商品 sku
     * @param  string $value 字段值
     * @param  array  $data  所有数据
     */
    public function getSkuAttr($value, $data)
    {
        $where = [
            'goods_id' => $data['id'],
        ];
        return GoodSku::field('id,goods_id,sku_id,sku_sn,sku_name,cost_price,market_price,sale_price,stock,sale_nums,weight')->append(['act_price'])->where($where)->order('id ASC')->select()->toArray();
    }
    
    /**
     * 获取商品总销量
     * @param string $value 字段值
     * @param array  $data  所有数据
     */
    public function getTotalSaleNumsAttr($value, $data)
    {
        $info = Goods::getById($data['id']);
        $sku = $this->getSkuAttr($value, $data);
        if ($sku) {
            $nums = 0;
            foreach ($sku as $v) {
                $nums += $v['sale_nums'];
            }
            return $nums + $info['diy_sale_nums'];
        } else {
            return $info['diy_sale_nums'];
        }
    }
    
    /**
     * 获取商品评论
     * @param string $value 字段值
     * @param array $data 所有数据
     */
    public function getEvaluatesListAttr($value, $data)
    {
        $where = [
            'goods_id' => $data['id'],
        ];
        return Evaluates::field(true)->append(['nickname', 'headimgurl', 'pics'])->where($where)->order('id desc')->select()->toArray();

    }

    /**
     * 获取商品属性
     * @param string $value 字段值
     * @param array  $data  所有数据
     */
    public function getAttrValueAttr($value, $data)
    {
        $where = [
            'goods_id' => $data['id'],
        ];
        return GoodAttrValue::field('id,attr_id,attr_name,attr_value')->where($where)->order('id ASC')->select()->toArray();
    }
    /**
     * 产品分类获取器
     * @param  string $value 字段值
     * @param  array  $data  所有数据
     */
    public function getProductNameAttr($value, $data)
    {
        $category = GoodCategoryModel::field('name')->where('id', $data['category_id'])->find();
        return $category['name'];
    }

    /**
     * 商品详情相册获取器
     * @param string $value 字段值
     * @param array  $data  所有数据
     */
    public function getContentPicDetailAttr($value, $data)
    {
        $album = $data['content_pic'] ? unserialize($data['content_pic']) : [];
        foreach ($album as $k => $v) {
            $album[$k]['value'] = attach_uri($v['value']);
        }
        return $album;
    }

    /*商户名称*/
    public function getShopNameAttr($value, $data)
    {
        if ($data['store_id']) {

            $categories = Stores::where('id',$data['store_id'])->value('name');
            return  $categories;
        }
        return '';
    }
    /*商户名称*/
    public function getShopTxtAttr($value, $data)
    {
        if ($data['store_id']) {

            $info = Stores::where('id',$data['store_id'])->find();
            return  $info;
        }
        return '';
    }

	/**
	 * 商品分销修改器
	 * @param array $value 字段值
	 */
	public function setCommissionChargeAttr($value)
	{
		return is_array($value) ? serialize($value) : '';
	}

	/**
	 * 商品分销获取器
	 * @param string $value 字段值
	 */
	public function getCommissionChargeAttr($value)
	{
		return $value ? unserialize($value) : [];
	}

	/**
	 * 邮费模板获取器
	 * @param string $value 字段值
	 * @param array $data 所有数据
	 */
	public function getPostageAttr($value,$data)
	{
		$postage = Postage::field(true)->where('id',$data['postage_id'])->find();

		return $postage;
	}

	/**
	 * 活动类型
	 * @param string $value 字段值
	 * @param array $data 所有数据
	 */
	public function getIsActivityAttr($value,$data)
	{
		$act = $this->Activity($data);
		return $act?1:0;
	}

	/**
	 * 是否为活动商品
	 * @param string $value 字段值
	 * @param array $data 所有数据
	 */
	public function getActivityTypeAttr($value,$data)
	{
		$act = $this->Activity($data);
		return $act?$act['act_type']:0;
	}

	/**
	 * 活动商品价格
	 * @param string $value 字段值
	 * @param array $data 所有数据
	 */
	public function getActivityPriceAttr($value,$data)
	{
		$act = $this->Activity($data);
		return $act?$act['sale_price']:0;
	}


	/**
	 * 活动
	 * @param string $value 字段值
	 */
	public function Activity($value)
	{
		$act = ActivityGoods::field('id,act_type,sale_price')->where('goods_id',$value['id'])->find();
		return $act;
	}


	/**
	 * 拼团列表
	 * @param string $value 字段值
	 * @param array $data 所有数据
	 */
	public function getActOrderAttr($value,$data)
	{
		$where = [
			['activity_goods','eq',$data['id']],
			['activity_parent_order','eq',0],
			['pay_status','eq',1],
		];
		$order = Orders::field('id,group_num,group_sale,activity_parent_order,userid,activity_enddt')
			->where($where)->append(['group_list','user_info'])->order('id desc')->select();

		return $order;
	}
	
	/**
	 * 产品参数获取器
	 * @param  string $value 字段值
	 */
	public function getParameterListAttr($value,$data)
	{
		if($data['parameter']){
			$data['parameter'] = json_decode($data['parameter'],true);
			foreach ($data['parameter'] as $k =>$v){
			    if(!empty($v)){
                    		$list[] = $v;
                	    }
			}
			return $list;
		}
		return [];
	}
}
